package estruturas;

import java.awt.font.NumericShaper;

import negocios.Produtos;

public class ListaDE extends ListaAbstrata {

	private CelulaProdutos primeira;
	private CelulaProdutos ultima;
	private int totalElementos = 0;

	public void adicionaComeco(Object obj) {

		if (totalElementos == 0) {
			CelulaProdutos nova = new CelulaProdutos(primeira, (Produtos) obj);

			this.primeira = nova;
			this.ultima = nova;
		}
		// else {
		// Celula nova = new Celula(primeira,obj);
		//
		// this.primeira.setAnterior(nova);
		// this.primeira = nova;
		// }
		this.totalElementos++;
	}

	public void adicionaFimLista(Object obj) {

		if (this.totalElementos == 0) {
			// /soma + 1 e posição do primeiro elemento é 0
			CelulaProdutos nova = new CelulaProdutos(primeira, (Produtos) obj);

			this.primeira = nova;
			this.ultima = nova;
		} else {

			CelulaProdutos novaCelula = new CelulaProdutos((Produtos) obj);
			this.ultima.setProxima(novaCelula);
			novaCelula.setAnterior(ultima);

			this.ultima = novaCelula;

		}
		totalElementos++;
	}

	// public void adicionaPosicao(int posicao, Object obj){
	//
	// if(posicao == 0){
	// adicionaComeco(obj);
	// }
	// else if(posicao == totalElementos){
	// adicionaFimLista(obj);
	// }
	// else{
	// Celula anterior = pegaCelula(posicao - 1);
	// Celula proxima = pegaCelula(posicao + 1);
	// Celula nova = new Celula(anterior.getProxima(), obj);
	//
	// anterior.setProxima(nova);
	// nova.setAnterior(anterior);
	//
	// proxima.setAnterior(nova);
	// totalElementos++;
	// }
	// }

	public CelulaProdutos pegaCelula(int posicao) {

		CelulaProdutos atual = primeira;
		for (int i = 0; i < posicao; i++) {
			atual = (CelulaProdutos) atual.getProxima();
		}
		return atual;
	}

	// public void exibe(ListaDE lista) {
	//
	// CelulaProdutos atual = lista.primeira;
	//
	// if (totalElementos == 0) {
	// throw new IllegalArgumentException("Lista vazia");
	// }
	//
	// while (!atual.equals(lista.ultima)) {
	// System.out.println(atual.getObjeto());
	// atual = (CelulaProdutos)atual.getProxima();
	// }
	// System.out.println(atual.getObjeto());
	// }
	
	public void remover(int posicao) {
		
		CelulaProdutos celula = pegaCelula(posicao);
		if(posicao == 0){
			removerComeco();
		} else if(posicao == (totalElementos - 1))
			removeFinal();

		else{
			celula.getAnterior().setProxima(celula.getProxima());
			celula.getProxima().setAnterior(celula.getAnterior());
			totalElementos--;
			System.out.println("Elemento eliminado");
		}	
	}

	public void removerComeco() {

		this.primeira = (CelulaProdutos) this.primeira.getProxima();
		this.totalElementos--;

		if (totalElementos == 0) {
			this.ultima = null;
			this.primeira = null;
		}
	}

	public void removeFinal() {

		if (this.totalElementos == 1) {
			this.removerComeco();

		} else {
			CelulaProdutos penultima = (CelulaProdutos) this.ultima
					.getAnterior();
			penultima.setProxima(null);
			this.ultima = penultima;
			this.totalElementos--;
		}
	}

	// método buscar por indice e retornar o objeto que está armazenado nele
	public Produtos buscar(int posicao) {

		return (Produtos) pegaCelula(posicao).getObjeto();
	}

	public int getTotalElementos() {
		return totalElementos;
	}

	public void setTotalElementos(int totalElementos) {
		this.totalElementos = totalElementos;
	}

}
